/*************************************************************************
    > File Name:    common.h
    > Author:       ChenMeng
    > Mail:         chen-meng@example.com
	> Created Time: 2018年06月21日 星期四 09时14分45秒
 ************************************************************************/

#ifndef _COMMON_LOG_H_
#define _COMMON_LOG_H_

#include <stdio.h>
#include <string.h>
#if defined (__MACH__) && defined (__APPLE__)
#include <malloc/malloc.h>
#include <libgen.h>
#else
#include <malloc.h>
#endif
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <errno.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include <time.h>
#include <fcntl.h>
#include <stdint.h>
#include "sf_assert.h"

#if __GNUC__ >= 3
#define UNLIKELY(e) __builtin_expect(!!(e), 0)
#define LIKELY(e)   __builtin_expect(!!(e), 1)
#else
#define UNLIKELY(e)
#define LIKELY(e)
#endif

#ifndef ARRAY_SIZE
#define ARRAY_SIZE(a) ((int)(sizeof(a)/sizeof(a[0])))
#endif

#ifndef UNUSED
#define UNUSED(a) ((void)(a))
#endif

#ifdef __GNUC__
#define PRINTF_FORMAT(a,b) __attribute__ ((format (printf, (a), (b))))
#define STRUCT_PACKED __attribute__ ((packed))
#else
#define PRINTF_FORMAT(a,b)
#define STRUCT_PACKED
#endif

enum DebugLevel
{
    // old
    LOG_DUMP  = 20,
    LOG_DEBUG = 40,
    LOG_INFO  = 60,
    LOG_WARN  = 80,
    LOG_ERROR = 100,
    // new
    SLOG_DUMP  = 20,
    SLOG_DEBUG = 40,
    SLOG_INFO  = 60,
    SLOG_WARN  = 80,
    SLOG_ERROR = 100,
};

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

typedef void (*SFLogFunction)(const char *file, int file_len, const char *func, int func_len, int line, int level, const char *format, ...) PRINTF_FORMAT(7, 8);

//! 安全打印内部直接调用printf, 函数位于msg_logger.cpp
void _safety_log_out(const char *file, int file_len, const char *func, int func_len, int line, int level, const char *format, ...) PRINTF_FORMAT(7, 8);

//! 一个全局的函数指针,默认定义在libevents_core目录中
//! @warning 如果没有连接这个库,APP就要自己定义这个函数指针, 默认只有调用init_all 函数之后就会初始化这个函数指针
//!     初始化的代码函数定义实现在libevents_log库文件中
extern SFLogFunction __logprintf;


#ifdef __cplusplus
}
#endif // __cplusplus

#ifdef GEN_Printf
#undef GEN_Printf
#endif

#define GEN_Printf(level, fmt, arg...) \
    do{ \
        __logprintf(__FILE__, sizeof(__FILE__)-1, __FUNCTION__, sizeof(__FUNCTION__)-1, __LINE__, level, fmt, ##arg); \
    }while(0)

#define SLOG(level, fmt, arg...) \
    do{ \
        __logprintf(__FILE__, sizeof(__FILE__)-1, __FUNCTION__, sizeof(__FUNCTION__)-1, __LINE__, level, fmt, ##arg); \
    }while(0)


#undef PRINTF_FORMAT
#undef STRUCT_PACKED

#endif  // _COMMON_LOG_H_
